<?php

namespace core\controller;


use core\Application;
use core\library\Input;
use core\utils\BeanManager;
use core\utils\CurlUtil;

class Controller {
    protected $layoutFoot = true;
    protected $layoutHead = true;
    /**
     * @var Application
     */
    protected $app;

    public function __construct() {
        try {
            $this->app = BeanManager::getInstance()->getBean(Application::class);
        } catch (\ReflectionException $e) {
        }
    }

    /**
     * 加载视图文件
     * @param string $view 视图
     * @param array $data 传到视图的数据
     */
    protected function render(string $view = '', array $data = []) {
        // 设置content-type
        header('Content-Type: text/html;');
        $data['input'] = Input::getInstance();
        $viewTrueDirArray = [
            'module'        => $this->app->getModule(),
            'controller'    => '',
            'action'        => ''
        ];
        // 解析传进来的view
        if ('' == $view) {
            $class = substr(get_called_class(), strrpos(get_called_class(), '\\') + 1);
            $viewTrueDirArray['controller'] = strtolower(str_replace('Controller', '', $class));
            $viewTrueDirArray['action'] = lcfirst(str_replace('action', '', debug_backtrace()[1]['function']));
        } else {
            if (strpos($view, '/')) { // index/index类型的
                $t = explode('/', $view);
                $viewTrueDirArray['controller'] = $t[0];
                $viewTrueDirArray['action'] = $t[1];
            } else {
                $class = substr(get_called_class(), strrpos(get_called_class(), '\\') + 1);
                $viewTrueDirArray['controller'] = strtolower(str_replace('Controller', '', $class));
                $viewTrueDirArray['action'] = $view;
            }
        }

        // 视图文件
        $viewFile = 'modules/'.$viewTrueDirArray['module'].'/views/'.$viewTrueDirArray['controller'].'/'.
            $viewTrueDirArray['action'].'.'.config('view.ext');
        // 加载文件
        // 检查文件是否存在
        if (file_exists($viewFile)) {
            // 把传进来的数据加载到页面上
            foreach ($data as $key => $val)
                $$key = $val;
            // 加载layout的头部
            if ($this->layoutHead) {
                $this->layoutHead = is_string($this->layoutHead) ? $this->layoutHead : config('layout.head');
                $headFile = 'modules/'.$viewTrueDirArray['module'].'/views/'.config('layout.dir') . '/' .
                    $this->layoutHead  . '.' .config('view.ext');
                if (file_exists($headFile)) {
                    include $headFile;
                } else {
                    throw new \Error('无法找到模板文件 : '.$headFile);
                }
            }
            // 加载正文内容
            include $viewFile;
            // 加载layout的脚部
            if ($this->layoutFoot) {
                $this->layoutFoot = is_string($this->layoutFoot) ? $this->layoutFoot : config('layout.foot');
                $footFile = 'modules/'.$viewTrueDirArray['module'].'/views/'.config('layout.dir') . '/' .
                    $this->layoutFoot  . '.' .config('view.ext');
                if (file_exists($footFile)) {
                    include $footFile;
                } else {
                    throw new \Error('无法找到模板文件 : '.$footFile);
                }
            }
        } else {
            throw new \Error('无法找到模板文件 : '.$viewFile);
        }
    }

    /**
     *
     * @param string $msg 提示信息
     * @param int $code   返回码
     * @param array $data 返回的数据
     * @return array      打包之后的数组
     */
    protected function renderJson(int $code = 0, string $msg = '', array $data = []) {
        header('Content-Type: application/json;charset=UTF8;');
        return [
            'msg' => $msg,
            'code' => $code,
            'data' => $data
        ];
    }

    /**
     * 页面跳转 (浏览器网址改变)
     * 直接跳， 毫不拖泥带水
     * @param string $url
     */
    public function redirect(string $url) {
        header('location:'.$url);
        exit;
    }

    /**
     * 调用本地页面
     * @param string $url
     * @param array $data
     * @return string
     */
    public function forward(string $url, array $data = []) : string {
        $method = strtolower($this->app->getMethod());
        $input = Input::getInstance();
        if (substr(0, 4) != 'http') {
            $url = $this->app->getRequestScheme() . '://' . $this->app->getHost(). ':' . $this->app->getPort() . $url;
        }
        $param = $input->$method();
        if ('get' === $method) {
            unset($param['s']);
        }
        // 在调用CURL去请求下一个页面的时候，必须要调用这个函数
        // 不然就会造成死锁，把整个页面都卡死，其他不需要使用到forward的页面也会
        session_write_close();
        return CurlUtil::$method($url, $param + $data, $input->cookie());
    }

    public function coreRedirect(string $url, array $d = []) {
        require 'core/views/' . $url . '.phtml';
    }

    public function success(string $src, string $msg, $time = 3) {
        require 'core/views/success.phtml';
    }

    public function error(string $src, string $msg, $time = 3) {
        $this->head = false;
        $this->foot = false;
        require 'core/views/error.phtml';
    }
}